package com.doublefish.doublefishrobot.utils.ble.bean;

/**
 * Created by peak on 2024/1/2
 */
public class CRCUtils {

    //region crc8
    public static byte calcCrc8(byte[] data) {
        //末位是校验码
        return calcCrc8(data, data.length - 1);
    }

    private static byte calcCrc8(byte[] data, int length){
        int CRC = 0;
        int genPoly = 0x8C;

        for(int i = 0; i < length; i++){
            CRC ^= data[i];
            // 保证 CRC 余码输出为 1 字节
            CRC &= 0xff;
            for(int j = 0; j < 8; j++){
                if((CRC & 0x01) != 0){
                    CRC = (CRC >> 1) ^ genPoly;
                    CRC &= 0xff;//保证CRC余码输出为1字节。
                }else{
                    CRC >>= 1;
                }
            }
        }
        // 保证CRC余码输出为1字节
        CRC &= 0xff;
        return (byte)CRC;
    }
    //endregion


    //region crc16
//    public static int calcCrc16(char[] data) {
//        //末2位是校验码
//        return calcCrc16(data, data.length - 2);
//    }

//    private static int calcCrc16(char[] data, int length) {
//        int crc = 0xFFFF;
//        for(int i = 0; i < length; i++){
//            crc ^= ((data[i] & 0xFF) << 8);
//            for (int j = 0; j < 8; j++) {
//                if ((crc & 0x8000) != 0) {
//                    crc = (crc << 1) ^ 0x1021;
//                } else {
//                    crc <<= 1;
//                }
//            }
//        }
//        return crc & 0xFFFF;
//    }

    public static int calcCrc16(char[] data, int length) {
        int sum = 0x0;
        for(int i = 0; i < length; i++){
            sum += data[i];
        }
        int sumH = (sum >> 8) & 0xFF;
        int sumL = sum & 0xFF;
        int crcH = sumH % 78 + 43;
        int crcL = sumL % 78 + 43;

        int crc = (crcH << 8) + crcL;
        return crc;
    }
    //endregion

}
